package day7.impl_pool;

import java.util.concurrent.BlockingQueue;
/**
 * 一个核心线程要进行的工作
 */
public class CoreJob implements Runnable {
    // 需要阻塞队列
    private final BlockingQueue<Runnable> workQueue;
    // 当前提交的任务
    private Runnable curCommand;

    CoreJob(BlockingQueue<Runnable> workQueue, Runnable curCommand) {
        this.workQueue = workQueue;
        this.curCommand = curCommand;
    }

    @Override
    public void run() {
        try {
            // 优先先把刚提交的任务先做掉了
            curCommand.run();
            // 这里设置 null 的意思是，不影响 curCommand 对象被 GC 时的回收
            curCommand = null;
            // 核心线程把手头工作做完后，会继续取任务、做任务
            while (!Thread.interrupted()) {
                // 这里用take，而不是poll。因为我们需要队列中没有任务时就要阻塞的效果
                Runnable command = workQueue.take();
                command.run();
            }
        } catch (InterruptedException ignored) {}
    }
}
